package pe.bf.extranet.ejb;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.Singleton;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.sql.DataSource;

import pe.bf.domain.bean.Usuario;
import pe.bf.domain.constantes.Constantes;
import pe.bf.domain.exceptions.DomainException;
import pe.bf.extranet.dao.UsuarioDAO;
import pe.bf.extranet.dao.impl.UsuarioDAOImpl;

/**
 * Session Bean implementation class UsuarioEJB
 */
@WebService
@Singleton
@LocalBean
public class UsuarioEJB {

	@Resource(name = Constantes.JNDI_DATASOURCE)
	public DataSource dataSource;

	public UsuarioDAO usuarioDAO;

	/**
	 * Default constructor.
	 */
	public UsuarioEJB() {
	}

	@WebMethod
	public void crearUsuario(Usuario usuario) {
		try {
			usuarioDAO.crearUsuario(usuario);
		} catch (DomainException e) {
			e.printStackTrace();
		}
	}

	@WebMethod
	public Usuario buscarUsuario(Usuario usuario) {
		try {
			Usuario usu = usuarioDAO.buscarUsuario(usuario);
			usu.setPerfilesString(usuarioDAO.obtenerPerfiles(usu.getIdUsuario()));
			return usu;
		} catch (DomainException e) {
			e.printStackTrace();
			return null;
		}
	}

	@WebMethod
	public Usuario buscarUsuarioPorId(Usuario usuario) {
		try {
			Usuario usu = usuarioDAO.buscarUsuarioPorId(usuario);
			usu.setPerfilesString(usuarioDAO.obtenerPerfiles(usu.getIdUsuario()));
			return usu;
		} catch (DomainException e) {
			e.printStackTrace();
			return null;
		}
	}

	@WebMethod
	public void actualizarUsuario(Usuario usuario) {
		try {
			usuarioDAO.actualizarUsuario(usuario);
		} catch (DomainException e) {
			e.printStackTrace();
		}
	}

	@WebMethod
	public void bajaUsuario(Usuario usuario) {
		try {
			usuarioDAO.bajaUsuario(usuario.getIdUsuario());
		} catch (DomainException e) {
			e.printStackTrace();
		}
	}
	
	@WebMethod
	public void activarUsuario(Usuario usuario) {
		try {
			usuarioDAO.activarUsuario(usuario.getIdUsuario());
		} catch (DomainException e) {
			e.printStackTrace();
		}
	}

	@WebMethod
	public boolean eliminarUsuario(Usuario usuario) {
		try {
			usuarioDAO.elimiarUsuario(usuario.getIdUsuario());
			return true;
		} catch (DomainException e) {
			e.printStackTrace();
			return false;
		}
	}

	@WebMethod
	public boolean actualizarClave(Usuario usuario) {
		try {
			usuarioDAO.actualizarClave(usuario);
			return true;
		} catch (DomainException e) {
			e.printStackTrace();
			return false;
		}
	}

	@WebMethod
	public List<Usuario> listarUsuario(BigInteger idEmpresa) {
		List<Usuario> lista = new ArrayList<Usuario>();
		try {
			lista = usuarioDAO.listarUsuarios(idEmpresa);
		} catch (DomainException e) {
			e.printStackTrace();
		}
		return lista;
	}
	
	@WebMethod
	public List<Usuario> obtenerPerfilUsuarios(List<Usuario> usuarios) {
		List<Usuario> lista = new ArrayList<Usuario>();
		try {
			lista = usuarioDAO.obtenerPerfiles(usuarios);
		} catch (DomainException e) {
			e.printStackTrace();
		}
		return lista;
	}


	@PostConstruct
	public void init() {
		usuarioDAO = new UsuarioDAOImpl(dataSource);
	}

}
